package controller;

import controller.util.JsfUtil;
import facade.BaixasFacade;
import facade.TituloPagarFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import modelo.Baixas;
import modelo.TituloPagar;

@ManagedBean(name = "tituloPagarController")
@SessionScoped
public class TituloPagarController implements Serializable {

    private TituloPagar current;
    private Baixas currentBaixas;
    
    private DataModel items = null;
    private DataModel itemsBaixas = null;
    
    private List<Baixas> listBaixasAUX;
    
    @EJB
    private facade.TituloPagarFacade ejbFacade;
    @EJB
    private facade.BaixasFacade ejbBaixasFacade;
    
    private String maskCgc = "999.999.999-99";

    public TituloPagarController() {
    }

    public TituloPagar getSelected() {
        if (current == null) {
            current = new TituloPagar();
        }
        return current;
    }

    public Baixas getBaixasSelected() {
        if (currentBaixas == null) {
            currentBaixas = new Baixas();
        }
        return currentBaixas;
    }

    private TituloPagarFacade getFacade() {
        return ejbFacade;
    }

    private BaixasFacade getBaixasFacade() {
        return ejbBaixasFacade;
    }

    public String prepareList() {
        recreateModel();
        return "List";
    }

    public void prepareListBaixas() {
        recreateModelBaixas();
    }

    public void prepareView() {
        current = (TituloPagar) getItems().getRowData();
        recreateModelBaixas();
        listBaixasAUX = getBaixasFacade().findByTitulo(current);
    }

    public void prepareCreate() {
        current = new TituloPagar();
        recreateModelBaixas();
        listBaixasAUX = new ArrayList<Baixas>();
    }

    public void prepareCreateBaixas() {
        currentBaixas = new Baixas();
    }

    public void create(ActionEvent actionEvent) {
        try {
            getFacade().create(current);
            for (Baixas b : listBaixasAUX){
                b.setTitulo(current);
                getBaixasFacade().create(b);
            }
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("TituloPagarCreated"));
            recreateModel();
            recreateModelBaixas();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    public void createBaixas(ActionEvent actionEvent) {
            listBaixasAUX.add(currentBaixas);
            itemsBaixas = new ListDataModel(listBaixasAUX);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("BaixasCreated"));
    }

    public void prepareEdit() {
        current = (TituloPagar) getItems().getRowData();
        recreateModelBaixas();
        listBaixasAUX = getBaixasFacade().findByTitulo(current);
    }

    public void prepareEditBaixas(ActionEvent actionEvent) {
        currentBaixas = (Baixas) getItemsBaixas().getRowData();
    }

    public void update() {
        try {
            for (Baixas e : listBaixasAUX){
                e.setTitulo(current);
            }
            current.setBaixasList(listBaixasAUX);
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("TituloPagarUpdated"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    public void updateBaixas(ActionEvent actionEvent) {
        try {
            listBaixasAUX.set(listBaixasAUX.indexOf(currentBaixas), currentBaixas);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("BaixasUpdated"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    public void destroy() {
        current = (TituloPagar) getItems().getRowData();
        current.setBaixasList(listBaixasAUX);
        performDestroy();
        recreateModel();
    }

    public void destroyBaixas(ActionEvent actionEvent) {
        currentBaixas = (Baixas) getItemsBaixas().getRowData();
        performDestroyBaixas();
        recreateModelBaixas();
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("TituloPagarDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void performDestroyBaixas() {
        listBaixasAUX.remove(currentBaixas);
    }

    public DataModel getItems() {
        if (items == null) {
            items = new ListDataModel(getFacade().findAll());
        }
        return items;
    }

    public DataModel getItemsBaixas() {
        if (itemsBaixas == null) {
            if (current.getBaixasList() != null)
                itemsBaixas = new ListDataModel(listBaixasAUX);
            else {
                itemsBaixas = new ListDataModel();
            }
        }
        return itemsBaixas;
    }

    private void recreateModel() {
        items = null;
    }

    private void recreateModelBaixas() {
        itemsBaixas = null;
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    @FacesConverter(forClass = TituloPagar.class)
    public static class TituloPagarControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            TituloPagarController controller = (TituloPagarController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "tituloPagarController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof TituloPagar) {
                TituloPagar o = (TituloPagar) object;
                return getStringKey(o.getTituloPK().getIdTitulo());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + TituloPagarController.class.getName());
            }
        }
    }
}
